﻿#include<iostream>
#include<string>
#include<cstdlib>
#include<Windows.h>
using namespace std;
void punishment()
{
	string input;
	system("shutdown -s -t 60");//包含头文件
	while (1)
	{
		cout << "由于您总是不按要求输入，现在将给予您一个小惩罚，您的电脑将在1分钟内自动关机，请注意这不是开玩笑";
		cout << "只要输入:（我错了）就可以终止关机！" << endl;
		cin >> input;
		if (strcmp(input.c_str(), "我错了") == 0)
		{
			system("shutdown -a");
			break;
		}
	}
	system("pause");
}
bool check(string& str)
{
	auto it = str.begin();
	int count = 3;
	while (it != str.end())
	{
		if ((*it >= '0' && *it <= '9') || (*it >= 'A' && *it <= 'Z') || (*it >= 'a' && *it <= 'z'))
			++it;
		else
		{
			--count;
			if (count == 0)
			{
				punishment();
				return false;
			}
			else
			{
				system("cls");
				cout << "您的输入有问题，请重新输入，您现在还有" << count << "次的输入机会" << endl;
				cout << "请认真对待，不然次数为0时会有惩罚" << endl;
				str.clear();
				cin >> str;
				it = str.begin();
			}
		}
	}
	return true;
}
// 加密算法
bool Encrypt(string& strProclaime)//简单的加密算法，要求只能输入大小写字母和阿拉伯数字
{                                 //对不按规则输入的，会进行检查并警告，警告三次后，依旧不正确输入会有小惩罚
	if (check(strProclaime) == 0)
	{
		cout << "惩罚结束，现在您可以选择继续运行程序去进行加密，注意：如果依旧不听话，照样会有惩罚！！！" << endl;
		return false;
	}
	system("cls");//进行加密的时候把原文在屏幕上清理掉
	cout << "加密进行中......." << endl;
	for (int i = 0; i < strProclaime.size(); i++)
	{
		Sleep(300);
		// 加密处理 0 - 9(ASCII中的48-57)
		if (strProclaime[i] >= '0' && strProclaime[i] <= '9')
			strProclaime[i] -= 14;
		// 加密处理 A- X(65-88)
		else if (strProclaime[i] >= 'A' && strProclaime[i] <= 'X')
			strProclaime[i] += 2;
		// 加密处理 a - x(97-120)
		else if (strProclaime[i] >= 'a' && strProclaime[i] <= 'x')
			strProclaime[i] += 2;
		// 加密处理 Y
		else if (strProclaime[i] == 'Y')
			strProclaime[i] = '!';
		// 加密处理 Z
		else if (strProclaime[i] == 'Z')
			strProclaime[i] = '?';
		// 加密处理 y
		else if (strProclaime[i] == 'y')
			strProclaime[i] = '^';
		// 加密处理 z
		else if (strProclaime[i] == 'z')
			strProclaime[i] = '@';
	}
	return true;
}
// 解密算法
void Decode(string& strCiphertext)//简单的加密算法，要求只能输入与之匹配的密文才能解密成功
{
	cout << "解密进行中......" << endl;
	for (int i = 0; i < strCiphertext.size(); i++)
	{
		Sleep(300);
		// 解密处理 " - +
		if (strCiphertext[i] >= '"' && strCiphertext[i] <= '+')
			strCiphertext[i] += 14;
		// 解密处理 C- Z(67-90)
		else if (strCiphertext[i] >= 'C' && strCiphertext[i] <= 'Z')
			strCiphertext[i] -= 2;
		// 解密处理 c - z(97-120)
		else if (strCiphertext[i] >= 'c' && strCiphertext[i] <= 'z')
			strCiphertext[i] -= 2;
		// 解密处理 !
		else if (strCiphertext[i] == '!')
			strCiphertext[i] = 'Y';
		// 解密处理 ?
		else if (strCiphertext[i] == '?')
			strCiphertext[i] = 'Z';
		// 解密处理 ^
		else if (strCiphertext[i] == '^')
			strCiphertext[i] = 'y';
		// 解密处理 @
		else if (strCiphertext[i] == '@')
			strCiphertext[i] = 'z';
	}
}
void menu()//特意写个菜单程序
{
	size_t input;
	string str;
	cout << "-----------------------------------------------这是一个简易的加密算法-----------------------------------------------" << endl;
	while (1)
	{
		cout << "-----------------------------------------------请选择您要进行的操作(数字即可):--------------------------------------" << endl;
		cout << "               0.退出                     1.加密                                  2.解密                     " << endl;
		cin >> input;
		switch (input)
		{
		case 0:
			cout << "退出成功" << endl;
			return;
		case 1:
			cout << "正在进行加密......" << endl;
			cout << "请输入明文，明文的输入范围是:任意的大小写字母和阿拉伯数字" << endl;
			cout << "输入的注意事项:您必须按输入范围要求去输入，总共有三次的输入机会，如果一直不按要求输入将会有小惩罚哦！" << endl;
			cin >> str;
			if (Encrypt(str) == 0)
				break;
			cout << "加密后的密文为:" << str << endl;
			break;
		case 2:
			cout << "正在进行解密......" << endl;
			cout << "请输入经此加密算法加密的内容，要认真输入哦，小心也有惩罚" << endl;
			cin >> str;
			Decode(str);//解密算法内部没有进行对应检查，检查也可以，也就是同样的逻辑，但会增加代码长度，实验报告装不下，所以我不写
			cout << "解密后的密文为:" << str << endl;
			break;
		default:
			system("cls");
			cout << "系统不知道您要干什么，请重新输入" << endl;
			break;
		}
	}
}
//int main()
//{
//	menu();
//	return 0;
//}